// #include<bits/stdc++.h>
// #define ONLINE_JUDGE
// #define ll long long
// #define ull unsigned long long
// using namespace std;

// const ll N = 15, INF = 0x3f3f3f3f;

// ll n, m;
// ll f[N][N][1 << 11];

// void solve()
// {
//     while (cin >> n >> m, n) {
//         if (n < m) swap(n, m);
//         memset(f, 0, sizeof f);
//         f[0][m][(1 << m) - 1] = 1;

//         for (ll x = 1;x <= n;x++)
//             for (ll y = 1;y <= m;y++) {
//                 ll prex, prey;
//                 if (y == 1) prex = x - 1, prey = m;
//                 else prex = x, prey = y - 1;
//                 for (ll k = 0;k < (1 << m);k++) {
//                     //不填
//                     if (k & (1 << m - 1)) {
//                         ll s = (k << 1) ^ (1 << m);
//                         f[x][y][s] += f[prex][prey][k];
//                     }
//                     //竖
//                     if (x > 1 && (k & (1 << (m - 1))) == 0) {
//                         ll s = (k << 1) ^ 1;
//                         f[x][y][s] += f[prex][prey][k];
//                     }
//                     //横
//                     if (y > 1 && (k & 1) == 0 && k & (1 << (m - 1))) {
//                         ll s = (k << 1) ^ (1 << m) ^ 3;
//                         f[x][y][s] += f[prex][prey][k];
//                     }
//                 }
//             }
//         cout << f[n][m][(1 << m) - 1] << '\n';
//     }

// }

// signed main()
// {
//     // ios::sync_with_stdio(0);
//     // cin.tie(0);cout.tie(0);
// #ifndef ONLINE_JUDGE
//     std::istringstream in(R"()");
//     std::cin.rdbuf(in.rdbuf());
// #endif
//     ll T = 1;
//     //cin>>T;
//     for (ll i = 1;i <= T;i++) {
//         solve();
//     }
// }

#include <vector>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 12, M = 1 << N;
typedef long long ll;
int n, m;
vector<int> tran[M];
ll dp[N][M];
bool st[M];

bool check(int x) { //判断该状态是否满足所有连续着空着的小方格必须是偶数个
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (x >> i & 1) {
            if (cnt & 1) return false;
            cnt = 0;
        } else ++cnt;
    }
    if (cnt & 1) return false;
    return true;
}

int main() {
    while (scanf("%d%d", &n, &m), n || m) {
        for (int i = 0; i < 1 << n; i++) st[i] = check(i); //提前预处理那哪些状态是合法的

        for (int i = 0; i < 1 << n; i++) {
            tran[i].clear();  
            for (int j = 0; j < 1 << n; j++)
                if (!(i & j) && st[i | j])
                    tran[i].push_back(j); //提前预处理出每个可行状态能由那些状态转移过来
        }

        memset(dp, 0, sizeof dp);
        dp[0][0] = 1;
        for (int i = 1; i <= m; i++)
            for (int j = 0; j < 1 << n; j++)
                for (int k = 0; k < tran[j].size(); k++)
                    dp[i][j] += dp[i - 1][tran[j][k]];
        printf("%lld\n", dp[m][0]);
    }
    return 0;
}